//################################################################################
// MIT License
// Copyright (c) 2024 ZhangYihua
//
// Change Logs:
// Date           Author       Notes
// 2023-10-30     ZhangYihua   first version
//
// Description  : 
//################################################################################

module rdat_hld #(
parameter           DW                      = 32,
parameter           ALL_NUM                 = 10,

// the following parameters are calculated automatically
parameter           SW                      = $clog2(ALL_NUM)
) ( 
input                                       rst_n,
input                                       clk,

output              [ALL_NUM-1:0]           stat_clr,
input               [ALL_NUM*DW-1:0]        stat_dat,

output  reg         [DW-1:0]                hld_dat,
input               [SW-1:0]                hld_sel,
input                                       hld_sel_fwe,
input                                       hld_clr
);

//################################################################################
// define local varialbe and localparam
//################################################################################
wire                [DW-1:0]                stat_dat_s;
reg                                         fwe_align;
wire                [ALL_NUM-1:0]           hld_hit;

//################################################################################
// main
//################################################################################

n2o #(
        .PNUM                           (ALL_NUM                        ),	// source port number
        .DWID                           (DW                             ),	// data width of one port
        .SMODE                          ("BINARY"                       ) 	// sel is binary signal
) u_mux ( 
        .sel                            (hld_sel                        ),	// support one-hot and all-zero input when SMODE
        .np_dat                         (stat_dat                        ),
        .op_dat                         (stat_dat_s                      )
);

always@(posedge clk or negedge rst_n) begin
    if (rst_n==1'b0) begin
        fwe_align <=`U_DLY 1'b0;
    end else begin
        fwe_align <=`U_DLY hld_sel_fwe;
    end
end

always@(posedge clk or negedge rst_n) begin
    if (rst_n==1'b0) begin
        hld_dat <=`U_DLY {DW{1'b0}};
    end else if (fwe_align==1'b1) begin
        hld_dat <=`U_DLY stat_dat_s;
    end
end

bin2onehot #(
        .OH_BW                          (ALL_NUM                        ) 	// bit width of one-hot number
) u_bin2onehot ( 
        .bin                            (hld_sel                        ),	// binary number
        .oh                             (hld_hit                        )	// one-hot number
);

assign stat_clr = hld_hit & {ALL_NUM{hld_clr & fwe_align}};

//################################################################################
// ASSERTION
//################################################################################

`ifdef CBB_ASSERT_ON
// synopsys translate_off


// synopsys translate_on
`endif

endmodule
